unit ListaUczniow;


interface

uses Narzedzia, ListaPrzedmiotow, ListaUwag;

procedure dodaj_ucznia(var head :wuczen; info: personal);
function szukaj_ucznia(head : wuczen; info:personal) : wuczen;
function licz_uczniow(head : wuczen) : integer;
procedure usun_ucznia(var head: wuczen; uczen_do_usun : wuczen);
procedure usun_uczniow(var head: wuczen);

implementation

{---------------------------------}
{ Operacje na liscie uczniow      }
{---------------------------------}

{ procedura dodaje ucznia }
procedure dodaj_ucznia(var head :wuczen; info: personal);
var
   p : wuczen;
begin
   new(p);

   p^.info := info;
   p^.przedmioty:=nil;

   p^.uwagi:=nil;
   p^.nastepny_uczen := head;
   head := p;

end;

{ funkcja szuka ucznia }
function szukaj_ucznia(head : wuczen; info:personal) : wuczen;
var
     aktualny : wuczen;
     jest : boolean;
begin
 aktualny := head;

  while aktualny <> nil do begin
      if (aktualny^.info.imie = info.imie) AND (aktualny^.info.nazwisko = info.nazwisko)  then begin
         jest:=true;
         break;
      end;

  aktualny:=aktualny^.nastepny_uczen;
  end;

  if jest then szukaj_ucznia := aktualny else szukaj_ucznia := nil;

end;

{ funkcja zwaraca ilosc uczniow }
function licz_uczniow(head : wuczen) : integer;
var
  c : integer;
begin
  c := 0;
  while head <> nil do begin
    inc(c);   //inkrementacja
    head := head^.nastepny_uczen;
  end;
  licz_uczniow := c;
end;

{ usuwa konkrentego ucznia }
procedure usun_ucznia(var head: wuczen; uczen_do_usun : wuczen);
var
 poprzedni, aktualny: wuczen;
begin
  aktualny := head;
  while(aktualny <> nil) do begin
    { jesli wskazniki do siebie pasuja mozemy usuwac }
    if(aktualny = uczen_do_usun) then begin
            { przypadek 1 - usuwamy glowe }
            if(aktualny = head) then begin

                   head := aktualny^.nastepny_uczen;

                   { usuwamy przedmiosty i oceny }
                   usun_przedmioty(aktualny^.przedmioty);

                   { usuwamy uwagi }
                   usun_uwagi(aktualny^.uwagi);

                   { usuwamy nas }
                   dispose(aktualny);

                   { dla bezpiecznstwa }
                   aktualny := nil;

                   { dalej nie musimy iterować }
                   exit;

            end
            { normlane usuwanie }
            else begin

                   poprzedni^.nastepny_uczen:= aktualny^.nastepny_uczen;

                   { usuwamy przedmiosty i oceny }
                   usun_przedmioty(aktualny^.przedmioty);

                   { usuwamy uwagi }
                   usun_uwagi(aktualny^.uwagi);

                   { usuwamy nas }
                   dispose(aktualny);

                   { dla bezpiecznstwa }
                   aktualny := nil;

                   { dalej nie musimy iterować }
                   exit;
            end;
    end
    { skaczemy dalej }
    else begin
         poprzedni := aktualny;
         aktualny := aktualny^.nastepny_uczen;
    end;
  end;
end;

{ usuwa cala liste uczniow oraz wszystkie podlisty }
procedure usun_uczniow(var head: wuczen);
var
    aktualny: wuczen;
begin
    aktualny := head;
    while aktualny <> nil  do begin
          aktualny := aktualny^.nastepny_uczen;
         //  writeln('usuwam: ', head^.info.nazwisko);
          { usuwa przedmioty i oceny }
          usun_przedmioty(head^.przedmioty);

          { usuwa uwagi }
          usun_uwagi(head^.uwagi);

          { usawa siebie }
          dispose(head);
          head := aktualny;
    end;
    head := nil;
end;



end.

